package com.gxz.filetest.config;

import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Slf4j
@Component // 将对象交由spring进行管理
@Aspect
public class WebLogAspect {

    @Pointcut("execution(public * com.gxz.logbacktest.controller..*.*(..))")
    public void webLog() {}

    @Around("webLog()")
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        // 获取方法名
        String className = pjp.getSignature().getClass().getName();
        // 获取执行的方法名称
        String methodName = pjp.getSignature().getName();
        // 定义返回参数
        Object result = null;
        // 记录开始时间
        long start = System.currentTimeMillis();
        // 获取方法参数
        Object[] args = pjp.getArgs();
        StringBuilder params = new StringBuilder("前端请求参数为:");
        //获取请求参数集合并进行遍历拼接
        for (Object object : args) {
            params.append(object.toString()).append(",");
        }
        params = new StringBuilder(params.substring(0, params.length() - 1));
        //打印请求参数参数
        log.info(className+"类的"+methodName + "的" + params);
        // 执行目标方法
        result = pjp.proceed();
        // 打印返回报文
        log.info("方法返回报文为:" + JSONUtil.toJsonStr(result));
        // 获取执行完的时间
        log.info(methodName + "方法执行时长为:" + (System.currentTimeMillis() - start));
        return result;
    }
}
